package com.onpositive.units;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;

import org.w3c.dom.Element;

public class XMLValueParser {
	
	static private HashMap< String, Class<?> > parsedValueMap ;
	
	static{
		parsedValueMap = new HashMap<String, Class<?>>() ;
		parsedValueMap.put( ParsedDate.ID      , ParsedDate.class      ) ;
		parsedValueMap.put( ParsedDimension.ID , ParsedDimension.class ) ;
		parsedValueMap.put( ParsedIdent.ID     , ParsedIdent.class     ) ;
		parsedValueMap.put( ParsedScalar.ID    , ParsedScalar.class    ) ;
		parsedValueMap.put( ParsedString.ID	   , ParsedString.class    ) ;
		parsedValueMap.put( ParsedLinkArray.ID , ParsedLinkArray.class    ) ;
		//parsedValueMap.put( ParsedSection.ID   , ParsedSection.class    ) ;
		parsedValueMap.put( "undef"	   , ParsedString.class    ) ;
		parsedValueMap.put( TextContent.ID     , TextContent.class    ) ;
		parsedValueMap.put( ParsedFileList.ID  , ParsedFileList.class    ) ;
		parsedValueMap.put( ParsedValueSequence.ID  , ParsedValueSequence.class    ) ;
		parsedValueMap.put( ValueCluster.ID  , ValueCluster.class    ) ;
		parsedValueMap.put( ParsedValueSequenceV2.ID  , ParsedValueSequenceV2.class    ) ;
		parsedValueMap.put( ParsedSentence.ID  , ParsedSentence.class    ) ;
	}
	
	public static ParsedValue produceParsedValue( Element valueElement ){
		
		String type = valueElement.getAttribute( ParsedValue.META_KEY_ID ) ;
		
		Class<?> valueClass = parsedValueMap.get( type ) ;
		if( valueClass == null )
			return null ;
		try {			
			Constructor<?> constructor = valueClass.getConstructor( Element.class ) ;
			return (ParsedValue)constructor.newInstance( valueElement ) ;
			
		} catch (SecurityException e) {
			e.printStackTrace();
			return null ;
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
			return null ;
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null ;
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null ;
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null ;
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null ;
		} catch (NullPointerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null ;
		}
		
	}

}
